Object Spec
내가 도커를 생성할 때 docker run <옵션들>
을 사용하여 컨테이너를 띄웠듯이, 쿠버네티스에서도 kubectl create <Object> ..
명령으로 여러 오브젝트를 생성할 수 있다.
예를 들어, kubectl create deployment dpy-hname --image=sysnet4admin/echo-hname
명령으로 디플로이먼트를 생성을 하면 1개의 파드만 생성이 된다.
여러 개의 파드를 생성하기 위해서는 위 명령을 치고 난 후에, kubectl scale deployment dpy-hname --replicas=3
명령으로 파드 개수를 다시 지정해줘야 한다.
그렇다면 처음에 생성하면서 여러 개의 파드를 만들 수는 없을까?
create
커맨드에서는 replicas 옵션을 사용할 수 없고, scale
커맨드에서는 이미 만들어진 디플로이먼트에서만 사용할 수 있는데 방법이 뭐가 있을까?.
이런 설정을 적용하려면 필요한 내용을 파일로 작성해야 한다. 마치 docker-compose의 yaml 파일 처럼 말이다. 이 때 작성하는 파일을 **오브젝트 스펙(spec)**이라고 한다. 오브젝트 스펙은 일반적으로 YAML 문법으로 작성한다.
YAML 작성하기
3개의 nginx 파드를 디플로이먼트 오브젝트로 생성해보도록 하자. kubectl create
명령어로는 3개의 파드를 가진 디플로이먼트를 생성할 수 없으므로 오브젝트 스펙을 작성해 디플로이먼트를 만들어보지.
apiVersion: apps/v1 # API 버전
kind: Deployment # 오브젝트 종류
metadata:
name: echo-hname
labels:
app: nginx
spec:
replicas: 3 # 몇 개의 파드를 생성할 지 지정
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: echo-hname
image: sysnet4admin/echo-hname # 사용할 이미지
apiVersion은 오브젝트를 포함하는 API의 버전을 의미한다. 여기서 사용하는 apps/v1은 여러 종류의 kind(오브젝트)를 가지고 있는데, 그 중에서 Deployment를 선택해 레플리카셋을 생성하였다. 레플리카셋은 몇 개의 파드를 생성할 지 replicas로 결정한다.
사용 가능한 API 버전을 확인하려면?
쿠버네티스에서 사용 가능한 API 버전은
kubectl api-versions
명령으로 확인할 수 있다. 쿠버네티스 버전에 따라 사용 가능한 API 버전이 다르니 작성 전 확인하기 바람.
admissionregistration.k8s.io/v1
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1
coordination.k8s.io/v1beta1
crd.projectcalico.org/v1
discovery.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
networking.k8s.io/v1beta1
node.k8s.io/v1beta1
policy/v1beta1
rbac.authorization.k8s.io/v1
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
파일 구조 살펴보기
생성하기
위에서 작성한 echo-hname.yaml 파일로 디플로이먼트를 생성해보도록 하자.
$ kubectl create -f ./echo-hname.yaml
deployment.apps/echo-hname created
파드의 개수가 3개가 맞는지 확인해보도록 하자.
$ kubectl get pods -o wide | grep -v "[AZ]" | wc -l
3
replicas 변경
echo-hname.yaml 파일을 수정해 파드를 3개에서 6개로 늘려보도록 하자.
$ sed -i 's/replicas: 3/replicas: 6/' ./echo-hname.yaml
-i,--in-place
: 변경한 내용을 현재 파일에 바로 적용s/
: 주어진 패턴을 원하는 패턴으로 변경. 여기서는 replicas: 3을 replicas: 6으로 변경
replicas의 값이 6으로 변경되었는지 확인
$ cat ./echo-hname.yaml
# ...
spec:
replicas: 6 # 몇 개의 파드를 생성할 지 지정
# ...
변경된 내용 적용
$ kubectl create -f ./echo-hname.yaml
Error from server (AlreadyExists): error when creating "./echo-hname.yaml": deployments.apps "echo-hname" already exists
그런데 "echo-hname이 이미 존재한다"는 에러가 발생하였다. scale 명령으로 파드 수를 임의로 늘리거나 줄일 수는 있지만, 파일(yaml)로 디플로이먼트의 파드 수를 조절하는 것은 불가능할까?
apply로 오브젝트 생성/관리
kubectl create
로 디플로이먼트를 생성하면 위와 같이 파일의 변경사항을 바로 적용할 수가 없다.
이런 경우를 위해 쿠버네티스는 apply라는 명령어를 제공하고 있다.
1. replicas를 6으로 수정한 echo-hname.yaml 파일을 kubectl apply 명령으로 적용해보자
$ kubectl apply -f ./echo-hname.yaml
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
deployment.apps/echo-hname configured
오브젝트를 처음부터 apply로 띄운 것이 아니라 경고가 뜨지만 작동에는 문제가 없다. 하지만 일관성에 문제가 생길 수 있으므로 변경 사항이 발생할 가능성이 있는 오브젝트는 처음부터 apply로 생성하도록 하자.
2. 명령이 적용된 후에 echo-hname pod가 6개로 늘어났는지 확인하자. (AGE를 확인해 최근 추가된 파드 확인)
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
echo-hname-7894b67f-664jj 1/1 Running 0 14m 172.16.221.138 w1-k8s <none> <none>
echo-hname-7894b67f-dbl2c 0/1 ContainerCreating 0 9s <none> w1-k8s <none> <none>
echo-hname-7894b67f-n4pqd 1/1 Running 0 9s 172.16.221.140 w1-k8s <none> <none>
echo-hname-7894b67f-nl9nw 1/1 Running 0 9s 172.16.221.141 w1-k8s <none> <none>
echo-hname-7894b67f-q6djw 1/1 Running 0 14m 172.16.221.137 w1-k8s <none> <none>
echo-hname-7894b67f-wtbpw 1/1 Running 0 14m 172.16.221.139 w1-k8s <none> <none>